function fn(a) {
    console.log(a);
    var a = 123
    console.log(a);
    function a() { }
    var b = function () { }
    console.log(b);
    function d() { }
    var d = a
    console.log(d);
}
fn(1)
// 1. 创建函数执行上下文对象di
// 2. 找形参和变量声明，将形参和变量名作为上下文对象的属性名(也就是放进变量环境里面)，值为 undefind
//形参有a，第三行也有a，则只用一个a，且a=undefind,变量声明有第三行的a，第六行的b
//第九行的d，则最后会得到a=undefind，b=undefind,d=undefind
// 3. 将实参和形参统一
//形参只有a，实参为1，则得a=1，b=undefind,d=undefind
// 4. 在函数体内找函数声明，函数名作为上下文对象的属性名，值为函数体
//函数声明有，第五行的a()，第八行的d()，则得到，a=function,b=undefind,d=function
//然后对函数体进行执行
//先进行第二行console.log(a)输出a=function
//再执行第三行给a赋值，则得a=123,b=undefind,d=function
//再执行第六行，得a=123,b=function,d=function
//再执行第七行console.log(b)输出b=function
//再执行第九行，得a=123,b=function,d=123
//再执行第十行，console.log(d)输出d=123
//见"D:\前端ai图片资料\预编译2.js.png"



